package com.nuyoah.controller;


import com.nuyoah.common.lang.Result;
import com.nuyoah.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import java.security.Principal;

@RestController
public class TestController {

    @Autowired
    UserService userService;

    @Autowired
    BCryptPasswordEncoder bCryptPasswordEncoder;

    /**
     * 测试方法，需要用户具有'superAdmin'或'admin'角色之一才能访问。
     *
     * @return 返回用户列表的结果对象。
     */
    @PreAuthorize("hasAnyRole('superAdmin','admin')")
    @GetMapping("/test")
    public Result test() {
        return Result.succ(userService.list());
    }

    /**
     * 测试密码加密和匹配的方法，需要用户具有'sys:user:list'权限才能访问。
     *
     * @return 返回加密后的密码结果对象。
     */
    @PreAuthorize("hasAuthority('sys:user:list')")
    @GetMapping("/test/pass")
    public Result pass() {
        // 加密用户输入的密码
        String password = bCryptPasswordEncoder.encode("111111");

        // 检查输入密码与加密后密码是否匹配
        boolean matches = bCryptPasswordEncoder.matches("111111", password);

        // 打印密码匹配结果
        System.out.println("匹配结果：" + matches);

        // 返回加密后的密码
        return Result.succ(password);
    }

    /**
     * 问候方法，返回当前登录用户的名字。
     *
     * @return 返回当前登录用户的名字。
     */
    @GetMapping("/hello")
    public String hello() {
        Object principal = SecurityContextHolder.getContext().getAuthentication().getPrincipal();

        // 如果principal是UserDetails类型，则直接返回用户名
        if (principal instanceof UserDetails) {
            return ((UserDetails) principal).getUsername();
        }

        // 如果principal是Principal类型，则返回Principal的名称
        if (principal instanceof Principal) {
            return ((Principal) principal).getName();
        }

        // 如果以上都不满足，则返回principal的字符串形式
        return "当前登录用户：" + String.valueOf(principal);
    }

}

